package main.java;

import java.io.IOException;
import java.util.ArrayList;       
import java.util.List;       
        
import org.apache.hadoop.conf.Configuration;       
import org.apache.hadoop.hbase.HBaseConfiguration;       
import org.apache.hadoop.hbase.HColumnDescriptor;       
import org.apache.hadoop.hbase.HTableDescriptor;       
import org.apache.hadoop.hbase.KeyValue;       
import org.apache.hadoop.hbase.MasterNotRunningException;       
import org.apache.hadoop.hbase.ZooKeeperConnectionException;       
import org.apache.hadoop.hbase.client.Delete;       
import org.apache.hadoop.hbase.client.Get;       
import org.apache.hadoop.hbase.client.HBaseAdmin;       
import org.apache.hadoop.hbase.client.HTable;       
import org.apache.hadoop.hbase.client.Result;       
import org.apache.hadoop.hbase.client.ResultScanner;       
import org.apache.hadoop.hbase.client.Scan;       
import org.apache.hadoop.hbase.client.Put;       
import org.apache.hadoop.hbase.util.Bytes;       
        
public class MyCase {         
           
    private static Configuration conf =null;    
     /**  
      * 初始化配置  
     */    
     static {
    	 /**
    	  * 首先在classpath下查找habse-site.xml文件，解析封装到Configuration对象，
    	  * 若不若在，则使用hbase-site.xml，
    	  * 还可以通过config.set(name,value)来手工构建Configuration对象。
    	  */
         conf = HBaseConfiguration.create();    
     }    
         
    /**    
     * 创建一张表    
     */      
    public static void creatTable(String tableName, String[] familys) throws Exception {       
        
    	/*创建的话，指定表明和列，关于列的限定符什么的以后增加数据的时候加，创建表的时候指定列族*/
    	HBaseAdmin admin = new HBaseAdmin(conf);
        if (admin.tableExists(tableName)) {       
            System.out.println("table already exists!");       
        } else {       
            HTableDescriptor tableDesc = new HTableDescriptor(tableName);       
            for(int i=0; i<familys.length; i++){       
                tableDesc.addFamily(new HColumnDescriptor(familys[i]));       
            }       
            admin.createTable(tableDesc);       
            System.out.println("create table " + tableName + " ok.");       
        }        
    }       
           
    /**    
     * 删除表    
     */      
    public static void deleteTable(String tableName) throws Exception {       
       try {       
           HBaseAdmin admin = new HBaseAdmin(conf);       
           admin.disableTable(tableName);       
           admin.deleteTable(tableName);       
           System.out.println("delete table " + tableName + " ok.");       
       } catch (MasterNotRunningException e) {       
           e.printStackTrace();       
       } catch (ZooKeeperConnectionException e) {       
           e.printStackTrace();       
       }       
    }       
            
    /**    
     * 插入一行记录    
     */      
    public static void addRecord (String tableName, String rowKey, String family, String qualifier, String value)       
            throws Exception{       
        try {       
            HTable table = new HTable(conf, tableName);       
            Put put = new Put(Bytes.toBytes(rowKey));       
            put.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));       
            table.put(put);       
            System.out.println("insert recored " + rowKey + " to table " + tableName +" ok.");       
        } catch (IOException e) {       
            e.printStackTrace();       
        }       
    }       
        
    /**    
     * 删除一行记录    
     */      
    public static void delRecord (String tableName, String rowKey) throws IOException{       
        HTable table = new HTable(conf, tableName);       
        List list = new ArrayList();       
        Delete del = new Delete(rowKey.getBytes());       
        list.add(del);       
        table.delete(list);       
        System.out.println("del recored " + rowKey + " ok.");       
    }       
            
    /**    
     * 查找一行记录    
     */      
    public static void getOneRecord (String tableName, String rowKey) throws IOException{       
        HTable table = new HTable(conf, tableName);       
        Get get = new Get(rowKey.getBytes());       
        Result rs = table.get(get);       
        for(KeyValue kv : rs.raw()){       
            System.out.print(new String(kv.getRow()) + " " );       
            System.out.print(new String(kv.getFamily()) + ":" );       
            System.out.print(new String(kv.getQualifier()) + " " );       
            System.out.print(kv.getTimestamp() + " " );       
            System.out.println(new String(kv.getValue()));       
        }       
    }       
            
    /**    
     * 显示所有数据    
     */      
    public static void getAllRecord (String tableName) {       
        try{       
             HTable table = new HTable(conf, tableName);       
             Scan s = new Scan();       
             ResultScanner ss = table.getScanner(s);       
             for(Result r:ss){       
                 for(KeyValue kv : r.raw()){       
                    System.out.print(new String(kv.getRow()) + " ");       
                    System.out.print(new String(kv.getFamily()) + ":");       
                    System.out.print(new String(kv.getQualifier()) + " ");       
                    System.out.print(kv.getTimestamp() + " ");       
                    System.out.println(new String(kv.getValue()));       
                 }       
             }       
        } catch (IOException e){       
            e.printStackTrace();       
        }       
    }       
           
    public static void  main (String [] agrs) {       
        try {       
            String tablename = "scores111";       
            String[] familys = {"grade", "course"};       
            MyCase.creatTable(tablename, familys);       
                    
            //add record zkb       
            MyCase.addRecord(tablename,"zkb","grade","","5");       
            MyCase.addRecord(tablename,"zkb","course","","90");       
            MyCase.addRecord(tablename,"zkb","course","math","97");       
            MyCase.addRecord(tablename,"zkb","course","art","87");       
            //add record  baoniu       
            MyCase.addRecord(tablename,"baoniu","grade","","4");       
            MyCase.addRecord(tablename,"baoniu","course","math","89");       
                    
            System.out.println("===========get one record========");       
            MyCase.getOneRecord(tablename, "zkb");       
                    
            System.out.println("===========show all record========");       
            MyCase.getAllRecord(tablename);       
                    
            System.out.println("===========del one record========");       
            MyCase.delRecord(tablename, "baoniu");       
            MyCase.getAllRecord(tablename);       
                    
            System.out.println("===========show all record========");       
            MyCase.getAllRecord(tablename);       
        } catch (Exception e) {       
            e.printStackTrace();       
        }       
    }       
}     
